﻿// Autore: Mattia Barrasso

using System;
using NUnit.Framework;
using RecipesManager.Data;
using TechTalk.SpecFlow;

namespace RecipesManager.Specs.Ricetta
{
    [Binding, Scope(Feature = "AggiuntaRicetta")]
    class AggiungiRicetta : RicettaBDD
    {
        [BeforeScenario]
        public new void SetUpScenario()
        {
            base.SetUpScenario();
        }

        [AfterScenario]
        public new void TearDownScenario()
        {
            base.TearDownScenario();
        }

        [Given(Regex = "la ricetta \"([a-zA-Z ]+)\" non esiste")]
        public void DatoRicettaNonEsistente(string ricetta)
        {
            Assert.That(!Manager.Recipes.Contains(ricetta));
        }

        [Given(Regex = "la ricetta \"([a-zA-Z ]+)\" esiste")]
        public void DatoRicettaEsistente(string ricetta)
        {
            Manager.Recipes.Add(ricetta);
            Assert.That(Manager.Recipes.Contains(ricetta));
        }

        [Given(Regex = "ho inserito i valori")]
        public void DatoValoriInseriti(Table table)
        {
            base.NavigateToRecipes();
            base.GetRecipeUi();
            NewRecipe.Click();
            base.GetSingleRecipeUi();

            foreach (var row in table.Rows)
            {
                if(row["Attributi"].Equals("Nome"))
                {
                    RecipeName.SetValue(row["Valori"]);
                }
                else if (row["Attributi"].Equals("Minuti"))
                {
                    Assert.That(Minutes.Items.Count > Int32.Parse(row["Valori"]));
                    Minutes.Select(Int32.Parse(row["Valori"]));
                }
                else if (row["Attributi"].Equals("Ore"))
                {
                    Assert.That(Hours.Items.Exists(item => item.Text.Equals(row["Valori"])));
                    Hours.Select(row["Valori"]);
                }
                else if (row["Attributi"].Equals("Originale"))
                {
                    Source.SetValue(row["Valori"]);
                }
                else if (row["Attributi"].Equals("Porzioni"))
                {
                    Assert.That(Portions.Items.Exists(item => item.Text.Equals(row["Valori"])));
                    Portions.Select(row["Valori"]);
                }
                else if (row["Attributi"].Equals("Unita"))
                {
                    Assert.That(Units.Items.Count > Int32.Parse(row["Valori"]));
                    Units.Select(Int32.Parse(row["Valori"]));
                } 
                else
                {
                    Assert.Fail("Table");
                }
            }
        }

        [When(Regex = "salvo")]
        public void QuandoSalvo()
        {
            SaveRecipe.Click();
        }

        [Then(Regex = "l'operazione ha successo")]
        public void AlloraSuccesso()
        {
            Assert.That(MainWindow.ModalWindows().Count == 0);
        }

        [Then(Regex = "l'operazione non ha successo")]
        public void AlloraInsuccesso()
        {
            Assert.That(MainWindow.ModalWindows().Count == 1);
        }

        [Then(Regex = "la ricetta \"([a-zA-Z ]+)\" esiste")]
        public void AlloraRicettaEsiste(string ricetta)
        {
            Assert.That(Recipes.Items.Exists(recipe => recipe.Text.Equals(ricetta)));
            Assert.That(Manager.Recipes.Contains(ricetta));
        }

        [Then(Regex = "la ricetta \"([a-zA-Z ]+)\" non esiste")]
        public void AlloraRicettaNonEsiste(string ricetta)
        {
            Assert.That(!Recipes.Items.Exists(recipe => recipe.Text.Equals(ricetta)));
            Assert.That(!Manager.Recipes.Contains(ricetta));
        }

        [Then(Regex = "la ricetta \"([a-zA-Z ]+)\" ha i valori")]
        public void AlloraHaIValori(string ricetta, Table table)
        {
            foreach (var row in table.Rows)
            {
                if (row["Attributi"].Equals("Nome"))
                {
                    Assert.That(Manager.Recipes.Contains(row["Valori"]));
                }
                else if (row["Attributi"].Equals("Minuti"))
                {
                    int iMinutes = Int32.Parse(row["Valori"]);
                    Assert.That(Manager.Recipes[ricetta].PrepMinutes.Value.Equals(Int32.Parse(Minutes.Items[iMinutes].Text)));
                }
                else if (row["Attributi"].Equals("Ore"))
                {
                    Assert.That(Manager.Recipes[ricetta].PrepHours.Equals(Int32.Parse(row["Valori"])));
                }
                else if (row["Attributi"].Equals("Originale"))
                {
                    Assert.That(Manager.Recipes[ricetta].Source.Equals(row["Valori"]));
                }
                else if (row["Attributi"].Equals("Porzioni"))
                {
                    Assert.That(Manager.Recipes[ricetta].Servings.Equals(Int32.Parse(row["Valori"])));
                }
                else if (row["Attributi"].Equals("Unita"))
                {
                    int iUnit = Int32.Parse(row["Valori"]);
                    Assert.That(Manager.Recipes[ricetta].MeasureFamily.ToString().Equals(Units.Items[iUnit].Text));
                }
                else
                {
                    Assert.Fail("Table");
                }
            }
        }
    }
}
